+2007-06-20 Richard Hult <richard@imendio.com>
+
+ * gdk/quartz/gdkwindow-quartz.c (gdk_window_new):
+ * gdk/quartz/GdkQuartzWindow.c (windowDidResize): Don't create or
+ update the tracking rect in the window, move it to the view where
+ it belongs.
+
+ * gdk/quartz/GdkQuartzView.c (updateTrackingRect)
+ (viewDidMoveToWindow, viewWillMoveToWindow)
+ (setFrame, setBounds): Create and update the tracking rect here.
+
2007-06-19 Mathias Hasselmann <mathias.hasselmann@gmx.de>
* gdk/gdkinternals.h: Restore G_BEGIN_DECLS at the
GDK_QUARTZ_RELEASE_POOL;
}
+/* For information on seting up tracking rects properly, see here:
+ * http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/EventOverview.pdf
+ */
+-(void)updateTrackingRect
+{
+ GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window);
+ GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+ if (trackingRect)
+ {
+ [self removeTrackingRect:trackingRect];
+ trackingRect = nil;
+ }
+
+ if (!impl->toplevel)
+ return;
+
+ trackingRect = [self addTrackingRect:[self bounds]
+ owner:self
+ userData:nil
+ assumeInside:NO];
+}
+
+-(void)viewDidMoveToWindow
+{
+ if (![self window]) /* We are destroyed already */
+ return;
+
+ [self updateTrackingRect];
+}
+
+-(void)viewWillMoveToWindow:(NSWindow *)newWindow
+{
+ if ([self window] && trackingRect)
+ {
+ [self removeTrackingRect:trackingRect];
+ trackingRect = nil;
+ }
+}
+
+-(void)setFrame:(NSRect)frame
+{
+ [super setFrame:frame];
+ [self updateTrackingRect];
+}
+
+-(void)setBounds:(NSRect)bounds
+{
+ [super setBounds:bounds];
+ [self updateTrackingRect];
+}
+
@end
@interface GdkQuartzView : NSView {
GdkWindow *gdk_window;
+ NSTrackingRectTag trackingRect;
}
-(void)setGdkWindow:(GdkWindow *)window;
impl->height = content_rect.size.height;
/* Synthesize a configure event */
-
event = gdk_event_new (GDK_CONFIGURE);
event->configure.window = g_object_ref (window);
event->configure.x = private->x;
event->configure.height = impl->height;
_gdk_event_queue_append (gdk_display_get_default (), event);
-
- /* Update tracking rectangle */
- [[self contentView] removeTrackingRect:impl->tracking_rect];
- impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height)
- owner:impl->view
- userData:nil
- assumeInside:NO];
}
-(id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
backing:backingType
defer:flag];
-
- /* A possible modification here would be to only accept mouse moved events
- * if any of the child GdkWindows are interested in mouse moved events.
- */
[self setAcceptsMouseMovedEvents:YES];
-
[self setDelegate:self];
[self setReleasedWhenClosed:YES];
const char *title;
int style_mask;
- switch (attributes->window_type) {
- case GDK_WINDOW_TEMP:
- style_mask = NSBorderlessWindowMask;
- break;
- default:
- style_mask = (NSTitledWindowMask |
- NSClosableWindowMask |
- NSMiniaturizableWindowMask |
- NSResizableWindowMask);
- }
+ switch (attributes->window_type)
+ {
+ case GDK_WINDOW_TEMP:
+ style_mask = NSBorderlessWindowMask;
+ break;
+ default:
+ style_mask = (NSTitledWindowMask |
+ NSClosableWindowMask |
+ NSMiniaturizableWindowMask |
+ NSResizableWindowMask);
+ }
impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
styleMask:style_mask
title = get_default_title ();
gdk_window_set_title (window, title);
-
+
if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
{
[impl->toplevel setOpaque:NO];
impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
[impl->view setGdkWindow:window];
[impl->toplevel setContentView:impl->view];
-
- /* Add a tracking rect */
- impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height)
- owner:impl->view
- userData:nil
- assumeInside:NO];
}
break;
+
case GDK_WINDOW_CHILD:
{
GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
}
}
break;
+
default:
g_assert_not_reached ();
}